/**
 ******************************************************************************
 * @file           : bsp_adc.h
 * @brief          : ADC Driver Header File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * ADC驱动程序头文件
 * 支持单通道和多通道ADC采集
 * 支持DMA传输和内部温度传感器
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_ADC_H
#define __BSP_ADC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/ADC/bsp_adc_config.h"  /* 包含配置文件获取ADC_SUPPORT_DMA */

/* Exported types ------------------------------------------------------------*/
/**
 * @brief ADC错误码枚举
 */
typedef enum
{
    ADC_OK = 0,                 /*!< 成功 */
    ADC_ERROR_PARAM,            /*!< 参数错误 */
    ADC_ERROR_TIMEOUT,          /*!< 超时错误 */
    ADC_ERROR_HAL               /*!< HAL库错误 */
} ADC_Error_e;

/**
 * @brief ADC状态枚举
 */
typedef enum
{
    ADC_STATE_IDLE = 0,         /*!< 空闲状态 */
    ADC_STATE_BUSY,             /*!< 忙状态 */
    ADC_STATE_CONVERTING,       /*!< 转换中 */
    ADC_STATE_DMA,              /*!< DMA传输中 */
    ADC_STATE_ERROR             /*!< 错误状态 */
} ADC_State_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void adc_init(void);                                                            /* ADC初始化 */
void adc_deinit(void);                                                          /* ADC反初始化 */

/* 单次转换函数 */
uint16_t adc_read_channel(uint32_t channel);                                    /* 读取单个通道 */
float adc_read_voltage(uint32_t channel);                                       /* 读取通道电压 */

/* 多次采样函数 */
uint16_t adc_read_average(uint32_t channel, uint8_t times);                     /* 多次采样平均 */
float adc_read_voltage_average(uint32_t channel, uint8_t times);                /* 电压多次采样平均 */

#if ADC_SUPPORT_DMA
/* DMA相关函数（仅ADC1/3支持，ADC2不支持DMA） */
void adc_dma_init(void);                                                        /* ADC DMA初始化 */
ADC_Error_e adc_start_dma(void);                                                /* 启动DMA采集 */
ADC_Error_e adc_stop_dma(void);                                                 /* 停止DMA采集 */
uint16_t adc_get_dma_value(uint8_t channel_index);                              /* 获取DMA采集值 */
float adc_get_dma_voltage(uint8_t channel_index);                               /* 获取DMA采集电压 */
uint8_t adc_is_dma_running(void);                                               /* 检查DMA是否运行 */
#endif

/* 内部传感器函数 */
float adc_read_temperature(void);                                               /* 读取内部温度 */
float adc_read_vrefint(void);                                                   /* 读取内部参考电压 */
float adc_get_vdda(void);                                                       /* 获取VDDA电压 */

/* 状态查询函数 */
ADC_State_e adc_get_state(void);                                                /* 获取ADC状态 */

/* 调试接口 */
void adc_print_status(void);                                                    /* 打印ADC状态 */
void adc_print_all_channels(void);                                              /* 打印所有通道值 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_ADC_H */
